//===-- ModuleChild.h -------------------------------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#ifndef liblldb_ModuleChild_h_
#define liblldb_ModuleChild_h_

#include "lldb/lldb-private.h"

namespace lldb_private {

//----------------------------------------------------------------------
/// @class ModuleChild ModuleChild.h "lldb/Core/ModuleChild.h"
/// @brief A mix in class that contains a pointer back to the module
///        that owns the object which inherits from it.
//----------------------------------------------------------------------
class ModuleChild
{
public:
    //------------------------------------------------------------------
    /// Construct with owning module.
    ///
    /// @param[in] module
    ///     The module that owns the object that inherits from this
    ///     class.
    //------------------------------------------------------------------
    ModuleChild (const lldb::ModuleSP &module_sp);

    //------------------------------------------------------------------
    /// Copy constructor.
    ///
    /// @param[in] rhs
    ///     A const ModuleChild class reference to copy.
    //------------------------------------------------------------------
    ModuleChild (const ModuleChild& rhs);

    //------------------------------------------------------------------
    /// Destructor.
    //------------------------------------------------------------------
    ~ModuleChild();

    //------------------------------------------------------------------
    /// Assignment operator.
    ///
    /// @param[in] rhs
    ///     A const ModuleChild class reference to copy.
    ///
    /// @return
    ///     A const reference to this object.
    //------------------------------------------------------------------
    const ModuleChild&
    operator= (const ModuleChild& rhs);

    //------------------------------------------------------------------
    /// Get const accessor for the module pointer.
    ///
    /// @return
    ///     A const pointer to the module that owns the object that
    ///     inherits from this class.
    //------------------------------------------------------------------
    lldb::ModuleSP
    GetModule () const;

    //------------------------------------------------------------------
    /// Set accessor for the module pointer.
    ///
    /// @param[in] module
    ///     A new module that owns the object that inherits from this
    ///      class.
    //------------------------------------------------------------------
    void
    SetModule (const lldb::ModuleSP &module_sp);

protected:
    //------------------------------------------------------------------
    // Member variables
    //------------------------------------------------------------------
    lldb::ModuleWP m_module_wp;   ///< The Module that owns the object that inherits
                                  ///< from this class.
};

} // namespace lldb_private


#endif  // liblldb_ModuleChild_h_
